﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.ModelBinding;
using System.Web.UI;
using System.Web.UI.WebControls;
using Box.BL;
using Box.Entities;
using Microsoft.Practices.Unity;

namespace Box.Cliente.Ventas
{
    public partial class frmCatalogarProducto : System.Web.UI.Page
    {
        private const string KEYPRODUCTO = "producto";
        [Dependency]
        public IInsumoBL insumoBL { get; set; }
        [Dependency]
        public IProductoBL productoBL { get; set; }
        [Dependency]
        public ICategoriaBL categoriaBL { get; set; }
        [Dependency]
        public ITipoProductoBL tipoProdBL { get; set; }
        
        protected void Page_Load(object sender, EventArgs e)
        {
            var opc = Request.QueryString["opc"];
            var idProd = Request.QueryString["id"];

            if (!Page.IsPostBack)
            {
                if (opc!=null && opc=="nuevo")
                {
                   
                    var producto = new Producto();
                    BindingProducto(producto);

                     ViewState["opc"] = opc;

                }else if (opc!=null && opc =="editar" && idProd!=null)
                {
                    var producto = productoBL.GetFromProductosById(int.Parse(idProd));
                    producto.TallaProducto = txtTalla.Text;
                    BindingProducto(producto);

                    ViewState["opc"] = opc;
                }
            }
        }


        #region GetInsumos
        public IQueryable<Insumo> GetInsumos([Control("txtCriterio")] string criterio)
        {
            return insumoBL.GetFromInsumosByCriterio(criterio).AsQueryable();
        }
        #endregion
        private void BindingProducto(Producto producto)
        {
            txtCodigo.Text = producto.Id.ToString();

            if (producto.NombreProducto!=null)
            {
                txtNombreProducto.Text = producto.NombreProducto;
            }
            producto.Precio = producto.DetalleCatalogoProductos.Sum(dp => dp.Monto);

            lvDetalleProducto.DataSource = producto.DetalleCatalogoProductos;
            lvDetalleProducto.DataBind();

            if (producto.DetalleCatalogoProductos.Count >0)
            {
                var lblTotal = lvDetalleProducto.FindControl("lblTotal") as Label;
                lblTotal.Text = producto.Precio.ToString();
            }
            Cache.Insert(KEYPRODUCTO,producto);
        }

        private Producto GetProducto()
        {
            return Cache.Get(KEYPRODUCTO) as Producto;
        }

        public IEnumerable<Categoria> GetCategorias()
        {
            return categoriaBL.GetAllFromCategorias();
        }

        public IEnumerable<TipoProducto> GetTipoProduto()
        {
            return tipoProdBL.GetAllFromTipoProductos();
        }

        protected void lvInsumos_ItemCommand(object sender, ListViewCommandEventArgs e)
        {
            if (e.CommandName=="AddDetalle")
            {
                

                var insumoId = Int32.Parse(e.CommandArgument.ToString());
                
                var producto = GetProducto();


                var existe = producto.DetalleCatalogoProductos
                    .Where(dp => dp.Insumo.Id == insumoId).SingleOrDefault();
                
                if (existe != null)
                {
                    existe.Cantidad += 1;
                }
                else
                {
                    var _insumo = insumoBL.GetFromInsumosById(insumoId);

                    var newInsumos = new DetalleCatalogoProductos()
                    {
                        Cantidad = 1,
                        Insumo = _insumo,
                        IdInsumo = insumoId,
                        IdProducto = producto.Id,
                        PrecioUnit = _insumo.Precio
                    };
                    producto.DetalleCatalogoProductos.Add(newInsumos);
               }
                producto.Precio = producto.DetalleCatalogoProductos.Sum(i => i.Monto);

                BindingProducto(producto);
//                Cache.Insert("producto",producto);
            }
        }
        #region ya no mas boton update
        protected void txtCantidad_TextChanged(object sender, EventArgs e)
        {
            try
            {
                var producto = GetProducto();

                foreach (var row in lvDetalleProducto.Items)
                {
                    var txtCantidad = row.FindControl("txtCantidad") as TextBox;
                    var txtPrecio = row.FindControl("txtPrecio") as TextBox;

                    producto.DetalleCatalogoProductos.ToList()[row.DisplayIndex]
                        .Cantidad = decimal.Parse(txtCantidad.Text);

                    producto.DetalleCatalogoProductos.ToList()[row.DisplayIndex]
                        .PrecioUnit = decimal.Parse(txtPrecio.Text);
                }
                BindingProducto(producto);
                Cache.Insert("producto", producto);
            }
            catch (Exception)
            {
                
                Response.Redirect("~/RedireccionErrores/500.aspx");
            }
            
        }
        protected void txtPrecio_TextChanged(object sender, EventArgs e)
        {
            try
            {
                var producto = GetProducto();

                foreach (var row in lvDetalleProducto.Items)
                {
                    var txtCantidad = row.FindControl("txtCantidad") as TextBox;
                    var txtPrecio = row.FindControl("txtPrecio") as TextBox;

                    producto.DetalleCatalogoProductos.ToList()[row.DisplayIndex]
                        .Cantidad = decimal.Parse(txtCantidad.Text);

                    producto.DetalleCatalogoProductos.ToList()[row.DisplayIndex]
                        .PrecioUnit = decimal.Parse(txtPrecio.Text);
                }
                BindingProducto(producto);
                Cache.Insert("producto", producto);
            }
            catch (Exception)
            {
                Response.Redirect("~/RedireccionErrores/500.aspx");
            }
            
        }
        #endregion
        protected void lvDetalleProducto_ItemCommand(object sender, ListViewCommandEventArgs e)
        {
            if (e.CommandName=="QuitarDetalle")
            {

                var insumoID = Int32.Parse(e.CommandArgument.ToString());

                var producto = GetProducto();

                var item = producto.DetalleCatalogoProductos
                    .Where(i => i.IdInsumo==insumoID).SingleOrDefault();

                if (item !=null)
                {
                    if (item.Cantidad==1)
                    {
                        producto.DetalleCatalogoProductos.Remove(item);
                    }
                    item.Cantidad -= 1;
                }
                BindingProducto(producto);
                Cache.Insert("producto",producto);
            }else if (e.CommandName=="ActualizarDetalle")
            {
                var producto = GetProducto();

                foreach (var row in lvDetalleProducto.Items)
                {
                    var txtCantidad = row.FindControl("txtCantidad") as TextBox;
                    var txtPrecio = row.FindControl("txtPrecio") as TextBox;

                    producto.DetalleCatalogoProductos.ToList()[row.DisplayIndex]
                        .Cantidad = decimal.Parse(txtCantidad.Text);

                    producto.DetalleCatalogoProductos.ToList()[row.DisplayIndex]
                        .PrecioUnit = decimal.Parse(txtPrecio.Text);
                }
                BindingProducto(producto);
                Cache.Insert("producto",producto);
            }
        }
      
        protected void btnGuardar_Click(object sender, EventArgs e)
        {
            //try
            //{
                var producto = GetProducto();

                producto.IdCategoria = Int32.Parse(cbCategoria.SelectedValue.ToString());
                producto.IdTipoProduto = Int32.Parse(cbTipoProducto.SelectedValue.ToString());

                producto.NombreProducto = txtNombreProducto.Text;
                producto.TallaProducto = txtTalla.Text;
                producto.Stock = 0;
                producto.DescripcionProducto = txtComentario.Text;
                producto.Estado = true;
                if (producto != null)
                {
                    if (ViewState["opc"].ToString() == "editar")
                    {
                        if (txtNombreProducto.Text != "" && txtTalla.Text != "")
                        {
                            productoBL.UpdateProducto(producto);

                            Response.Redirect("frmListProductos.aspx");
                        }
                        else
                        {
                            ScriptManager.
                                RegisterClientScriptBlock(this,
                                    this.GetType(), "alertMessage", "alert('Llenar Todos Los Campos Por Favor..!!')",
                                    true);
                        }


                    }
                    else if (ViewState["opc"].ToString() == "nuevo")
                    {
                        if (txtTalla.Text != null)
                        {
                            productoBL.AddProducto(producto);
                            Response.Redirect("frmListProductos.aspx");
                        }
                        else
                        {
                            ScriptManager.
                                RegisterClientScriptBlock(this,
                                    this.GetType(), "alertMessage", "alert('Debe llenar todo los campos..!!')", true);
                        }

                    }
                }
            //}
            //catch (Exception)
            //{
            //    Response.Redirect("~/RedireccionErrores/500.aspx");
            //}

        }
    }
}